package ar.com.gals.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import ar.com.gals.constants.Page;
import ar.com.gals.domain.Usuario;
import ar.com.gals.error.GalsException;
import ar.com.gals.model.BuscadorEmpleadoModel;
import ar.com.gals.model.EmpleadoModel;

@Controller
public class EmpleadoController extends AbstractController {

	@PreAuthorize("hasRole('EDEMPL')")
    @RequestMapping(value = "/GestionEmpleados", method = RequestMethod.GET)
    public String gestionDeUsuarios(Model model) {
    	try 
		{
			BuscadorEmpleadoModel empleadoModel = new BuscadorEmpleadoModel();
			List<Usuario> lista = empleadoModel.getEmpleados(this.getUsuario());
			
			model.addAttribute("usuarios", lista);
			model.addAttribute("model", empleadoModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.GESTION_EMPLEADOS;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }

    
	@PreAuthorize("hasRole('EDEMPL')")
    @RequestMapping(value = "/GestionEmpleados", method = RequestMethod.POST)
    public String gestionDeUsuarios(
    		@ModelAttribute("model") @Valid BuscadorEmpleadoModel empleadoModel, 
    		BindingResult result, 
    		Model model)
    {
    	try 
		{
    		List<Usuario> lista = empleadoModel.getEmpleados(this.getUsuario());
    		
			model.addAttribute("usuarios", lista);
			model.addAttribute("model", empleadoModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.GESTION_EMPLEADOS;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }
    
    
	@PreAuthorize("hasRole('EDEMPL')")
    @RequestMapping(value = "/GestionEmpleados/Alta", method = RequestMethod.GET)
    public String altaUsuario(Model model) {
    	
    	EmpleadoModel empleadoModel = new EmpleadoModel(this.getUsuario());
		model.addAttribute("model", empleadoModel);
		model.addAttribute("action", "A");
		model.addAttribute("function", "G");
		return Page.EDICION_EMPLEADO;
    }
    
    
	@PreAuthorize("hasRole('EDEMPL')")
    @RequestMapping(value = "/GestionEmpleados/Alta", method = RequestMethod.POST)
    public String altaUsuario(
    		@ModelAttribute("model") @Valid EmpleadoModel empleadoModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", empleadoModel);
				model.addAttribute("action", "A");
				model.addAttribute("function", "G");
				return Page.EDICION_EMPLEADO;
			}
			
			empleadoModel.crearUsuario(this.getUsuario());
		}
		catch(GalsException ex) {
			model.addAttribute("model", empleadoModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "A");
			model.addAttribute("function", "G");
			return Page.EDICION_EMPLEADO;
		}
		
		model.addAttribute("messageResult", "El empleado se cre&oacute; exitosamente");
		return "redirect:" + Page.URL_EMPLEADO;
    }
    
    
	@PreAuthorize("hasRole('EDEMPL')")
    @RequestMapping(value = "/GestionEmpleados/Modificar/{usuarioId}", method = RequestMethod.GET)
    public String modificarUsuario(@PathVariable("usuarioId") int usuarioId, Model model) {
		try 
		{
			EmpleadoModel empleadoModel = new EmpleadoModel(usuarioId);
			model.addAttribute("model", empleadoModel);
			model.addAttribute("action", "M");
			model.addAttribute("function", "G");
			return Page.EDICION_EMPLEADO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_EMPLEADO;
		}
    }

	
	@PreAuthorize("hasRole('EDEMPL')")
	@RequestMapping(value = "/GestionEmpleados/Modificar/{usuarioId}", method = RequestMethod.POST)
    public String modificarUsuario(
    		@PathVariable("usuarioId") int usuarioId,
    		@ModelAttribute("model") @Valid EmpleadoModel empleadoModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", empleadoModel);
				model.addAttribute("action", "M");
				model.addAttribute("function", "G");
				return Page.EDICION_EMPLEADO;
			}
	
			empleadoModel.modificarUsuario(usuarioId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", empleadoModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			model.addAttribute("function", "G");
			return Page.EDICION_EMPLEADO;
		}		
		
		model.addAttribute("messageResult", "El empleado se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_EMPLEADO;
    }
	

	@PreAuthorize("hasRole('EDEMPL')")
	@RequestMapping(value = "/GestionEmpleados/Eliminar/{usuarioId}", method = RequestMethod.GET)
    public String eliminarUsuario(@PathVariable("usuarioId") int usuarioId, Model model) {
		try 
		{
			EmpleadoModel empleadoModel = new EmpleadoModel(usuarioId);
			model.addAttribute("model", empleadoModel);
			model.addAttribute("action", "B");
			model.addAttribute("function", "G");
			return Page.EDICION_EMPLEADO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_EMPLEADO;
		}
    }

	
	@PreAuthorize("hasRole('EDEMPL')")
	@RequestMapping(value = "/GestionEmpleados/Eliminar/{usuarioId}", method = RequestMethod.POST)
    public String eliminarUsuario(
    		@PathVariable("usuarioId") int usuarioId,
    		@ModelAttribute("model") @Valid EmpleadoModel empleadoModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", empleadoModel);
				model.addAttribute("action", "B");
				model.addAttribute("function", "G");
				return Page.EDICION_EMPLEADO;
			}
	
			empleadoModel.eliminarUsuario(usuarioId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", empleadoModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "B");
			model.addAttribute("function", "G");
			return Page.EDICION_EMPLEADO;
		}

		model.addAttribute("messageResult", "El empleado se elimin&oacute; exitosamente");
		return "redirect:" + Page.URL_EMPLEADO;
    }
	
   
	@PreAuthorize("hasRole('EDPERF')")
    @RequestMapping(value = "/Perfil/Empleado", method = RequestMethod.GET)
    public String editarPerfil(Model model) {
		try 
		{
			EmpleadoModel empleadoModel = new EmpleadoModel(this.getUsuario().getId());
			model.addAttribute("model", empleadoModel);
			model.addAttribute("action", "M");
			model.addAttribute("function", "P");
			return Page.EDICION_EMPLEADO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }

	
	@PreAuthorize("hasRole('EDPERF')")
	@RequestMapping(value = "/Perfil/Empleado", method = RequestMethod.POST)
    public String editarPerfil(
    		@ModelAttribute("model") @Valid EmpleadoModel empleadoModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", empleadoModel);
				model.addAttribute("action", "M");
				model.addAttribute("function", "P");
				return Page.EDICION_EMPLEADO;
			}
	
			Usuario usuario = empleadoModel.editarPerfil(this.getUsuario().getId());
			this.setUsuario(usuario);
		}
		catch(GalsException ex) {
			model.addAttribute("model", empleadoModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			model.addAttribute("function", "P");
			return Page.EDICION_EMPLEADO;
		}		
		
		model.addAttribute("messageResult", "El perfil se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_INIT;
    }
	
}
